package collection;

import java.util.Comparator;
import java.util.TreeSet;

/**
 * Created with IntelliJ IDEA
 * Description:TreeSet学习
 * User:22954
 * Date:2024-02-20
 * Time:1:15
 */
@SuppressWarnings("all")
public class TreeSet_ {
    /*
    1.TreeSet继承AbstractSet实现Set接口继承Collection接口
    2.TreeSet底层维护的是TreeMap(红黑树)
      插入相同(根据比较器)元素时,新的值不会替换旧的值
    3.与HashMap最大不同点:可以对插入的元素排序
     */
    public static void main(String[] args) {
        /*
        第二种构造方法:传入比较器----Comparator接口(一般使用匿名内部类)
        1.插入的元素不能相同----根据传入的比较器(返回值为0则相同)
        2.插入的元素根据比较器存放(非普遍意义有序),但取出时呈现按比较器排序后顺序取出
         */
        TreeSet<String> treeSet = new TreeSet<>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.length() - o2.length();
            }
        });
        treeSet.add("Java");
        treeSet.add("C");
        treeSet.add("Python");
        treeSet.add("Matlab");
        treeSet.add("PHP");
        treeSet.add("C++");
        System.out.println(treeSet);//[C, PHP, Java, Python]
    }

    public static void main1(String[] args) {
        /*
        第一种构造方法:不传参构造
        1.插入的元素不能相同----根据hash和equals
        2.插入和取出元素时的顺序按泛型类自定义的compareTo排序----泛型类必须实现Comparable接口
         */
        TreeSet<String> treeSet = new TreeSet<>();
        treeSet.add("Java");
        treeSet.add("C");
        treeSet.add("Python");
        treeSet.add("Matlab");
        treeSet.add("C++");
        boolean ret = treeSet.add("C++");
        System.out.println(treeSet);//[C, C++, Java, Matlab, Python]
        System.out.println(ret);//false
        System.out.println("========================");
        TreeSet<Car> cars = new TreeSet<>();
        cars.add(new Car("benchi", 100));
        cars.add(new Car("baoma", 500));
        cars.add(new Car("aodi", 200));
        cars.add(new Car("bentian", 900));
        System.out.println(cars);
        /*
        [Car{name='benchi', price=100},
         Car{name='aodi', price=200},
         Car{name='baoma', price=500},
         Car{name='bentian', price=900}]
         */
    }
}

@SuppressWarnings("all")
class Car implements Comparable {
    private String name;
    private int price;

    public Car(String name, int price) {
        this.name = name;
        this.price = price;
    }

    @Override
    public String toString() {
        return "Car{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}' + "\n";
    }

    @Override
    public int compareTo(Object o) {
        Car car = (Car) o;
        return this.price - car.price;
    }
}
